
#ifndef _CASE_H_
#define _CASE_H_

/**
 * @file case.h
 * @brief Contient la structure Case et ses fonctions
 * @details liste des fonctions pour le module case
 * @version 1.0
 * @date 2013/05/16
*/
#include "Question.h"


/**
 * @enum GenreCase
 * @brief Enum GenreCase
 * @details le enum contient : 4 genre de case (exam,pioche,bonus,rien).
*/
typedef enum
{
	exam,
	pioche,
	bonus,
	rien
} GenreCase;

/**
 * @struct Case structure case
 * @brief Structure Case
 * @details	la structure contient: un enum avec 3 types pour le genre de la case ,un entier pour l'indice de la case ,un tableau de questions et un tableau de 2 booleens.
 * @param type pour le genre de la case
 * @param position son indice dans le plateau
 * @param action contient la question si le genre est exam ,NULL sinon.
 * @param valide pour savoir si le joueur est deja passé sur la case.
*/
typedef struct
{
	GenreCase type;
	int position;
	Question * action;
	bool * valide;
} Case;

/**
 * @brief initCase initialise type et position à 0 ,met le pointeur action a NULL et alloue pour valide au bon nb de joueurs.
 * @param [in-out] *uneCase carte a initialisée.
 * @param [in] nbJoueur le nombre de joueur dans la partie.
 * @return none
*/
void initCase (Case *uneCase, int nbJoueur);
/**
 * @brief creerCase alloue une Case et fais appel a initCase.
 * @param [in] nbj le nombre de joueur.
 * @return Case * la case crée.
*/
Case * creerCase(const int);
/**
 * @brief libereCase si la case contient une action et elle est de type exam fais appel a detruireQuest,sinon laisse action a NULL.
 * @param [in-out] *uneCarte la carte a liberer.
 * @return none
*/
void libereCase(Case *uneCase);
/**
 * @brief detruireCase fais appel a libereCase et met le pointeur a NULL.
 * @param [in] **C la carte a detruire.
 * @return none
*/
void detruireCase(Case **);
/**
 * @brief setTypeCase mutateur pour modifier le genre de la case.
 * @param [in-out] *uneCase la case concerné
 * @param [in] type le nouveau genre de la carte
 * @return none
*/
void setTypeCase (Case *, const GenreCase);
/**
 * @brief setPositionCase mutateur pour modifier la position de la case dans le Plateau.
 * @param [in-out] *uneCase la case concerné
 * @param [in] position la nouvelle position de la case.
 * @return none
*/
void setPositionCase (Case *, const int);
/**
 * @brief setActionCase mutateur pour modifier l'action de la case de genre "exam".
 * @param [in-out] *uneCase la case concerné
 * @param [in] *quest la nouvelle action de la case.
 * @return none
*/
void setActionCase(Case *, const Question *);
/**
 * @brief setValideCase mutateur pour modifier la validité de la case pour le joueur dont on passe l'indice en param.
 * @param [in-out] *uneCase la case concerné
 * @param [in] joueur l'indice du joueur concerné.
 * @param [in] res nouvel etat de valide .
 * @return none
*/
void setValideCase (Case *, const int, const bool);
/**
 * @brief getTypeCarte accesseur pour acceder au genre de la case passé en parametre.
 * @param [in] *uneCase la case concerné.
 * @return uneCarte->type le type de la case.
*/
GenreCase getTypeCase (const Case *);
/**
 * @brief getPositionCase accesseur pour acceder a la position de la case passé en parametre.
 * @param [in] *uneCase la case concerné.
 * @return uneCarte->position la position de la case sur le Plateau.
*/
int getPositionCase (const Case *);
/**
 * @brief getActionCase accesseur pour acceder a l'action de la case passé en parametre.
 * @param [in] *uneCase la case concerné.
 * @return uneCarte->action l'action de la case (retourne une Question)
*/
Question * getActionCase(const Case *);
/**
 * @brief getValideCase accesseur pour acceder a la validité de la case pour le joueur dont l'indice est passé en param .
 * @param [in] *uneCase la case concerné.
 * @param [in] joueur l'indice du joueur.
 * @return uneCarte->valide[joueur] l'etat de la validité pour  joueur.
*/
bool getValideCase (const Case *, const int);
/**
 * @brief caseTestRegression fais appel a toutes les fonctions du module Case et effectue des Tests.
 * @return void
*/
void caseTestRegression();


#endif
